package com.houtai.service.funcion;


import com.houtai.base.RetInfo;
import com.houtai.bean.TsJzAdmin;
import com.houtai.bean.TsJzFuncion;
import com.houtai.bean.TsJzFuncroleRel;
import com.houtai.bean.TsJzRole;
import com.houtai.dao.TsJzFuncionDao;
import com.houtai.dao.TsJzFuncroleRelDao;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by lizhun on 2017/4/12.
 */
@Service
public class FuncionService {

    private static Logger logger = Logger.getLogger(FuncionService.class);
    @Autowired
    private TsJzFuncionDao tsJzFuncionDao;
    @Autowired
    private TsJzFuncroleRelDao tsJzFuncroleRelDao;
    @Autowired
    private RedisTemplate redisTemplate;

    public RetInfo findFatherFuncion(TsJzAdmin tsJzAdmin) {
        String logInfo = this.getClass().getName() + ":findFatherFuncion:";
        // 类路径+方法名
        logger.info("======" + logInfo + "begin======");
        RetInfo retInfo = new RetInfo();
        try {
            Map<String, Object> result = new HashMap<>();
            List<TsJzFuncion> tsJzFuncions;
//            if (redisTemplate.opsForValue().get("father_funtions") != null) {
//                tsJzFuncions = (List<TsJzFuncion>)redisTemplate.opsForValue().get("tsJzFuncions");
//            } else {
                tsJzFuncions = tsJzFuncionDao.findFatherFuncion(tsJzAdmin.getRole_id());
                Map<String, Object> params = new HashMap<>();
                for (int i = 0 ; i < tsJzFuncions.size() ; i ++ ) {
                    params.put("parent_id", tsJzFuncions.get(i).getFunc_id());
                    params.put("role_id", tsJzAdmin.getRole_id());
                    List<TsJzFuncion> sonFuncion = getFuncions(params);
                    tsJzFuncions.get(i).setTsJzFuncions(sonFuncion);
                }
//                redisTemplate.opsForValue().set("father_funtions", tsJzFuncions);
//            }


            result.put("fatherFuncion", tsJzFuncions);
            retInfo.setMark("0");
            retInfo.setTip("成功");
            retInfo.setObj(result);

        } catch (Exception e) {
            retInfo.setMark("-1");
            retInfo.setTip("出错了");
            logger.error("======error:" + e.toString() + "======");
        }
        logger.info("======" + logInfo + "end======");
        return retInfo;
    }


    public RetInfo findSonFuncion(TsJzAdmin tsJzAdmin, int parent_id) {
        String logInfo = this.getClass().getName() + ":findSonFuncion:";
        // 类路径+方法名
        logger.info("======" + logInfo + "begin======");
        RetInfo retInfo = new RetInfo();
        try {
            Map<String, Object> result = new HashMap<>();
            Map<String, Object> params = new HashMap<>();
            params.put("parent_id", parent_id);
            params.put("role_id", tsJzAdmin.getRole_id());
            List<TsJzFuncion> sonFuncion = getFuncions(params);
            result.put("sonFuncion", sonFuncion);
            result.put("parent_id", parent_id);
            retInfo.setMark("0");
            retInfo.setTip("成功");
            retInfo.setObj(result);

        } catch (Exception e) {
            retInfo.setMark("-1");
            retInfo.setTip("出错了");
            logger.error("======error:" + e.toString() + "======");
        }
        logger.info("======" + logInfo + "end======");
        return retInfo;
    }


    public RetInfo findFuncionByRole(TsJzAdmin tsJzAdmin, TsJzRole tsJzRole) {
        String logInfo = this.getClass().getName() + ":findFuncionByRole:";
        // 类路径+方法名
        logger.info("======" + logInfo + "begin======");
        RetInfo retInfo = new RetInfo();
        try {
            Map<String,Integer> map = new HashMap<>();
            if (tsJzRole != null) {
                map.put("role_id", tsJzRole.getRole_id());
            }
            List<TsJzFuncion> tsJzFuncions = tsJzFuncionDao.findAllFatherFuncion();
            for (int i = 0 ; i < tsJzFuncions.size() ; i ++ ) {

                Map<String, Object> params = new HashMap<>();
                params.put("parent_id", tsJzFuncions.get(i).getFunc_id());
                List<TsJzFuncion> sonFuncion = tsJzFuncionDao.findAllSonFuncion(params);
                if (sonFuncion != null && sonFuncion.size() > 0) {
                    tsJzFuncions.get(i).setIs_father(0);
                    for (int j = 0 ; j < sonFuncion.size() ; j ++ ) {

                        params.put("parent_id", sonFuncion.get(j).getFunc_id());
                        List<TsJzFuncion> sonSonFuncion = tsJzFuncionDao.findAllSonFuncion(params);
                        if (sonSonFuncion != null && sonSonFuncion.size() > 0) {
                            sonFuncion.get(j).setIs_father(0);
                            for (int q = 0 ; q < sonSonFuncion.size() ; q ++ ) {
                                //判断该角色是否有该项权限
                                if (tsJzRole != null) {
                                    map.put("func_id", sonSonFuncion.get(q).getFunc_id());
                                    TsJzFuncroleRel funcroleRelDto = tsJzFuncroleRelDao.findFuncroleRelByRoleIdAndFuncId(map);
                                    if (funcroleRelDto != null && funcroleRelDto.getIs_valid().equals("0")) {
                                        sonSonFuncion.get(q).setIs_check(0);
                                    }
                                }
                            }

                            sonFuncion.get(j).setTsJzFuncions(sonSonFuncion);
                        }
                        //判断该角色是否有该项权限
                        if (tsJzRole != null) {
                            map.put("func_id", sonFuncion.get(j).getFunc_id());
                            TsJzFuncroleRel funcroleRelDto = tsJzFuncroleRelDao.findFuncroleRelByRoleIdAndFuncId(map);
                            if (funcroleRelDto != null && funcroleRelDto.getIs_valid().equals("0")) {
                                sonFuncion.get(j).setIs_check(0);
                            }
                        }
                    }

                    tsJzFuncions.get(i).setTsJzFuncions(sonFuncion);
                }
                //判断该角色是否有该项权限
                if (tsJzRole != null) {
                    map.put("func_id", tsJzFuncions.get(i).getFunc_id());
                    TsJzFuncroleRel funcroleRelDto = tsJzFuncroleRelDao.findFuncroleRelByRoleIdAndFuncId(map);
                    if (funcroleRelDto != null && funcroleRelDto.getIs_valid().equals("0")) {
                        tsJzFuncions.get(i).setIs_check(0);
                    }
                }
            }

            retInfo.setObj(tsJzFuncions);

            retInfo.setMark("0");
            retInfo.setTip("成功");

        } catch (Exception e) {
            retInfo.setMark("-1");
            retInfo.setTip("出错了");
            logger.error("======error:" + e.toString() + "======");
        }
        logger.info("======" + logInfo + "end======");
        return retInfo;
    }

    public List<TsJzFuncion> getFuncions(Map<String, Object> params) {
        List<TsJzFuncion> sonFuncion = tsJzFuncionDao.findSonFuncion(params);
        for ( int i = 0 ; i < sonFuncion.size() ; i ++ ) {
            params.put("parent_id", sonFuncion.get(i).getFunc_id());
            List<TsJzFuncion> funcionDtos = tsJzFuncionDao.findSonFuncion(params);
            if (funcionDtos != null && funcionDtos.size() > 0) {
                sonFuncion.get(i).setIs_father(0);
                sonFuncion.get(i).setTsJzFuncions(funcionDtos);
            }

        }
        return sonFuncion;
    }


}
